package modelo;

import java.util.Collection;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;

public class Ciudad {
        
    private String nombre;
        private LatitudYLongitud lat_y_long;
        private Descripcion descripcion;
        private Bandera bandera;
        private Moneda moneda;
        private Collection<Geografia> geografias;
        private Collection<LugarDeReferencia> referencias;
        private Collection<Industria> industrias;
        private Collection<Animal> animales;
        private Collection<Gente> gentes;
        private Collection<Idioma> idiomas;
        private Collection<Arte> artes;
        private Collection<Religion> religiones;
        private Gobierno gobierno;
        private Collection<Miscelaneo> miscelaneos;
        private Collection<Edificio> edificios;
        // Se supone que termina siendo de largo 3.

        public Ciudad(String nombre, double latitud, double longitud, String descripcion){
                this.nombre = nombre;
                lat_y_long = new LatitudYLongitud(latitud, longitud);
                this.descripcion = new Descripcion(descripcion);        
                bandera = null;
                moneda = null;
                geografias = new ArrayList<Geografia>();
                referencias= new ArrayList<LugarDeReferencia>();
                industrias = new ArrayList<Industria>();
                animales = new ArrayList<Animal>();
                gentes = new ArrayList<Gente>();
                idiomas = new ArrayList<Idioma>();
                artes = new ArrayList<Arte>();
                religiones = new ArrayList<Religion>();
                gobierno = null;
                miscelaneos = new ArrayList<Miscelaneo>();
                edificios = new ArrayList<Edificio>();
        }

        
        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (obj == null) return false;
            if (this.getClass() != obj.getClass()) return false;
            Ciudad obj_ciudad = (Ciudad) obj;
            if (this.nombre != obj_ciudad.nombre) return false;
            return true;
        }
        
        
        public boolean agregarEdificio(Edificio edificio){
                if (!edificios.contains(edificio)){
                        edificios.add(edificio);
                        return true;
                } return false;
        }

        public boolean agregarMoneda(Moneda moneda){
                if (this.moneda == null){
                        this.moneda = moneda;
                        return true;
                }
                return false;
        }
        
        public Moneda obtenerMoneda(){
                return moneda;
        }

        public boolean agregarBandera(Bandera bandera){
                if (this.bandera != null){
                        this.bandera = bandera;
                        return true;
                } return false;
        }

        public Bandera obtenerBandera(){
                return bandera;
        }
        
        public boolean agregarGeografia(Geografia geografia){
                if (!geografias.contains(geografia)){
                        geografias.add(geografia);
                        return true;
                } return false;
        }

        public Geografia obtenerGeografia(){
                if (geografias.isEmpty()) return null;
                Collections.shuffle((List<Geografia>) geografias);
                return ((ArrayList<Geografia>) geografias).get(0);
        }
        
        public boolean agregarLugarDeReferencia(LugarDeReferencia referencia){
                if (!referencias.contains(referencia)){
                        referencias.add(referencia);
                        return true;
                } return false;
        }

        public LugarDeReferencia obtenerLugarDeReferencia(){
                if (referencias.isEmpty()) return null;
                Collections.shuffle((List<LugarDeReferencia>) referencias);
                return ((ArrayList<LugarDeReferencia>) referencias).get(0);
        }
        
        public boolean agregarIndustria(Industria industria){
                if (!industrias.contains(industria)){
                        industrias.add(industria);
                        return true;
                } return false;
        }
        
        public Industria obtenerIndustria(){
                if (industrias.isEmpty()) return null;
                Collections.shuffle((List<Industria>) industrias);
                return ((ArrayList<Industria>) industrias).get(0);
        }

        public boolean agregarAnimal(Animal animal){
                if (!animales.contains(animal)){
                        animales.add(animal);
                        return true;
                } return false;
        }

        public Animal obtenerAnimal(){
                if (animales.isEmpty()) return null;
                Collections.shuffle((List<Animal>) animales);
                return ((ArrayList<Animal>) animales).get(0);
        }
        
        public boolean agregarGente(Gente gente){
                if (!gentes.contains(gente)){
                        gentes.add(gente);
                        return true;
                } return false;
        }

        public Gente obtenerGente(){
                if (gentes.isEmpty()) return null;
                Collections.shuffle((List<Gente>) gentes);
                return ((ArrayList<Gente>) gentes).get(0);
        }
        
        public boolean agregarIdioma(Idioma idioma){
                if (!idiomas.contains(idioma)){
                        idiomas.add(idioma);
                        return true;
                } return false;
        }
        
        public Idioma obtenerIdioma(){
                if (idiomas.isEmpty()) return null;
                Collections.shuffle((List<Idioma>) idiomas);
                return ((ArrayList<Idioma>) idiomas).get(0);
        }

        public boolean agregarArte(Arte arte){
                if (!artes.contains(arte)){
                        artes.add(arte);
                        return true;
                } return false;
        }
        
        public Arte obtenerArte(){
                if (artes.isEmpty()) return null;
                Collections.shuffle((List<Arte>) artes);
                return ((ArrayList<Arte>) artes).get(0);
        }

        public boolean agregarReligion(Religion religion){
                if (!religiones.contains(religion)){
                        religiones.add(religion);
                        return true;
                } return false;
        }
        
        public Religion obtenerReligion(){
                if (religiones.isEmpty()) return null;
                Collections.shuffle((List<Religion>) religiones);
                return ((ArrayList<Religion>) religiones).get(0);
        }

        public boolean agregarGobierno(Gobierno gobierno){
                if (this.gobierno != null){
                        this.gobierno = gobierno;
                        return true;
                } return false;
        }
        
        public Gobierno obtenerGobierno(){
                return gobierno;
        }

        public boolean agregarMiscelaneo(Miscelaneo misc){
                if (!miscelaneos.contains(misc)){
                        miscelaneos.add(misc);
                        return true;
                } return false;
        }

        public Miscelaneo obtenerMiscelaneo(){
                if (miscelaneos.isEmpty()) return null;
                Collections.shuffle((List<Miscelaneo>) miscelaneos);
                return ((ArrayList<Miscelaneo>) miscelaneos).get(0);
        }
        
        public LatitudYLongitud obtenerLatitudYLongitud(){
                return lat_y_long;
        }

        public Collection<Edificio> obtenerEdificios() {
                return edificios;
        }
        
        public String obtenerNombre(){
                return this.nombre;
        }

        public String obtenerDescripcion(){
                return descripcion.enString();
        }
        public void limpiarVisitas(){
                for (Edificio edificio : edificios){
                        edificio.limpiarVisitas();
                }
        }

        public int distanciaEnKMCon(Ciudad ciudad){
                return lat_y_long.distanciaEnKMCon(ciudad.obtenerLatitudYLongitud());
        }
                



}